#include "student_common.h"
#include "linked_list_common.h"
#include <iostream>
using namespace std;

// 解决方案：在student.cpp和admin.cpp内部重新声明struct node，
// 并用C风格强转访问链表节点（通过指针偏移），实现遍历。
// 只需在cpp文件顶部加如下声明：

struct node
{
    void *data;
    node *prev;
    node *next;
};

// 获取链表头指针的通用函数（仅限cpp内部使用，不影响封装）
static node *get_head(linked_list *list)
{
    return *(node **)((char *)list + 0); // head在类内第一个成员
}
static node *get_tail(linked_list *list)
{
    return *(node **)((char *)list + sizeof(void *)); // tail在类内第二个成员
}

// 修改所有遍历链表的地方：
// node *cur = get_head(list);
// ... cur = cur->next ...
// node *cur = get_tail(list); // 用于逆序遍历
// ... cur = cur->prev ...
// 这样可以安全遍历链表。

// 显示学生信息
void student::show_student_msg()
{
    cout << "学号: " << student_id << ", 年龄: " << student_age << ", 姓名: " << student_name << ", 地址: " << student_address << endl;
}

// 成员函数--对比学生信息
int compare_student_msg_by_id(linked_list *list, int id)
{
    node *cur = get_head(list);
    while (cur)
    {
        student *stu = static_cast<student *>(cur->data);
        if (stu->get_student_id() == id)
            return 0;
        cur = cur->next;
    }
    return -1;
}

// 成员函数--显示全部学生信息
void select_all_student_msg(linked_list *list)
{
    node *cur = get_head(list);
    cout << "\n所有学生信息：" << endl;
    while (cur)
    {
        student *stu = static_cast<student *>(cur->data);
        stu->show_student_msg();
        cur = cur->next;
    }
}

// 成员函数--通过id查找写生信息
student *select_student_msg_by_id(linked_list *list, int id)
{
    node *cur = get_head(list);
    while (cur)
    {
        student *stu = static_cast<student *>(cur->data);
        if (stu->get_student_id() == id)
            return stu;
        cur = cur->next;
    }
    return nullptr;
}

// 成员函数--添加学生信息，并返回添加信息
void add_student_msg(linked_list *list, student *stu)
{
    list->insert_tail(list, stu);
}

// 成员函数--通过id删除学生信息
void delete_student_msg_by_id(linked_list *list, int id)
{
    node *cur = get_head(list);
    int pos = 0;
    while (cur)
    {
        student *stu = static_cast<student *>(cur->data);
        if (stu->get_student_id() == id)
        {
            list->delete_middle(list, pos);
            return;
        }
        cur = cur->next;
        pos++;
    }
}

// 成员函数--通过id修改学生信息
student *update_student_msg_by_id(linked_list *list, int id)
{
    node *cur = get_head(list);
    while (cur)
    {
        student *stu = static_cast<student *>(cur->data);
        if (stu->get_student_id() == id)
        {
            // 假设我们要修改的信息是姓名、年龄和地址
            string new_name;
            int new_age;
            string new_address;

            cout << "请输入新的姓名: ";
            cin >> new_name;
            cout << "请输入新的年龄: ";
            cin >> new_age;
            cout << "请输入新的地址: ";
            cin >> new_address;

            stu->set_student_name(new_name);
            stu->set_student_age(new_age);
            stu->set_student_address(new_address);
            return stu;
        }
        cur = cur->next;
    }
    return nullptr;
}